package com.uab.ia.utils;

import java.util.ArrayList;
import java.util.List;

import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import com.android.dataframework.DataFramework;
import com.android.dataframework.Entity;
import com.uab.ia.entidades.Conexion;
import com.uab.ia.entidades.Estacion;

public class Utils {

	private static Utils utils;
	private SharedPreferences prefs;
	public Float VELOCIDAD_TRENES = (float) 0;
	public static final int NUM_ESTACIONES = 39;

	private Utils() {

	}

	public static Utils getInstance() {
		if (utils == null) {
			utils = new Utils();
		}
		return utils;
	}

	public Conexion getConexion(long e1, long e2) {
		String where = "id_e1=? AND id_e2=?";
		String[] args = new String[] { Long.toString(e1), Long.toString(e2) };

		String sql = "SELECT * FROM conexion WHERE " + where;

		SQLiteDatabase db = DataFramework.getInstance().getDB();
		Cursor c = db.rawQuery(sql, args);

		if (c.moveToFirst()) {
			Conexion conex = new Conexion();
			conex.setId_e1(c.getLong(1));
			conex.setId_e2(c.getLong(2));
			conex.setTime(c.getInt(3));
			conex.setConected(Boolean.parseBoolean(c.getString(4)));
			c.close();
			return conex;
		}
		return null;
	}

	public double getTimeBetweenEstaciones(long e1, long e2) {
		Conexion c = getConexion(e1, e2);
		if(getDistanceBetweenEstaciones(e1, e2)==0)
		{
			return 0;
		}
		if (c.isConected()) {
			return c.getTime();
		} else {
			return getDistanceBetweenEstaciones(e1, e2) * 12;
		}
	}

	public double getTimeAndandoBetweenEstaciones(long e1, long e2) {
		return getDistanceBetweenEstaciones(e1, e2) * 12;
	}

	public double getEstimatedHeuristic(long id1, long id2) {
		return getDistanceBetweenEstaciones(id1, id2) / getVelMaxTren();

	}

	public int getEstimatedHeuristicTrans(long e1, long e2) {
		boolean c = getSameLine(e1, e2);
		if (c) {
			return 0;
		}
		return 4;
	}
	
	public int getEstimatedHeuristicParadas(long e1, long e2) {
		
		if (e1!=e2) {
			return 1;
		}
		return 0;
	}

	public double getDistanceBetweenEstaciones(long id1, long id2) {
		Estacion e1 = new Estacion(id1);
		Estacion e2 = new Estacion(id2);
		double sumaX = e1.getX() - e2.getX();
		double sumaY = e1.getY() - e2.getY();
		double cuadratX = (double) Math.pow(sumaX, 2);
		double cuadratY = (double) Math.pow(sumaY, 2);
		double arrel = (double) Math.sqrt(cuadratX + cuadratY);

		return arrel;
	}

	public boolean getSameLine(long e1, long e2)
	{
		Estacion es1 = new Estacion(e1);
		Estacion es2 = new Estacion(e2);
		
		return es1.getLinea().equals(es2.getLinea());
		
	}
	
	public float getVelMaxTren() {

		Float max = (float) 0;
		if (!prefs.contains("VELOCIDAD")) {
			List<Entity> entidades = DataFramework.getInstance().getEntityList(
					"conexion");

			ArrayList<Conexion> array = new ArrayList<Conexion>();

			for (Entity ent : entidades) {
				array.add(new Conexion(ent));
			}

			double calculparcial = 0.0;
			for (Conexion conex : array) {
				if (conex.isConected()) {
					double dis = getDistanceBetweenEstaciones(conex.getId_e1(),
							conex.getId_e2());
					double time = getTimeBetweenEstaciones(conex.getId_e1(),
							conex.getId_e2());
					if (dis != 0) {
						calculparcial = dis / time;
						if (calculparcial > max) {
							max = (float) calculparcial;
						}
					}
				}
			}
			Editor editor = prefs.edit();
			editor.putFloat("VELOCIDAD", max);
			editor.commit();
		} else {
			max = (float) 4;
		}

		VELOCIDAD_TRENES = max;
		return max;

	}

	public SharedPreferences getPrefs() {
		return prefs;
	}

	public void setPrefs(SharedPreferences prefs) {
		this.prefs = prefs;
	}
}
